<?php
/**
 * @version		1.0: classMaszyna.php marum56
 * @package		Joomla
 */

// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();

jimport( 'joomla.html.parameter');

/**
 * Obiekt class.  
 *
 * @package 	Joomla
 * @subpackage	maszyna
 * @since	1.0
 */
class msMaszyna extends JObject
{
	/**
	 * Numer identyfikujący grupę
	 * @var int
	 */
	var $gid			= null;
	
	/**
	 * Error message
	 * @var string
	 */
	var $_errorMsg			= null;


	/**
	* Constructor
	* @param 	int 	$identifier 	Numer identyfikujący grupę do zaladowania
	* @access 	protected
	*/
	function __construct($identifier = 0)
	{
		// Load if it exists
		if (!empty($identifier)) {
			// Uataw identyfikator grupy
			$this->gid = $identifier;
			// Załaduj obiekt danymi z BD
			$this->load();
		} else {
			//initialise
			$this->gid        = 0;
		}
	}

	/**
	 * Returns a reference to the global Model object, only creating it if it
	 * doesn't already exist.
	 *
	 * This method must be invoked as:
	 * 		<pre>  $maszyna =& msMaszyna::getInstance($gid); </pre>
	 *
	 * @access 	public
	 * @param 	int 	$gid 	Numer identyfikujący grupę do zaladowania
	 * @return 	msMaszyna  	The Producent object.
	 * @since 	1.0
	 */
	function &getInstance($gid = 0)
	{
		static $instances = array ();
		
		if (empty($instances[$gid])) {
			//
			$ob = new msMaszyna($gid);   // Przy przeniesieniu kodu zmieniamy tylko tą klasę np. msPojazdy($gid);
			$instances[$gid] = $ob;
		}

		return $instances[$gid];
	}

	/**
	 * Method to get the table object
	 *
	 * @access 	public
	 * @param	string	$name  Nazwa klasy tablicy
	 * @param	string	$prefix Prefix klasy tablicy
	 * @return	object	The table object
	 * @since	1.5
	 */
	function &getTable( $name = null, $prefix = 'msTable' )
	{
		// Create the table object 
		$table 	=& JTable::getInstance( $name, $prefix );
		return $table;
	}

	/**
	 * Method to bind an associative array of data to a object
	 *
	 * @access 	public
	 * @param 	array 	$array 	The associative array to bind to the object
	 * @return 	boolean 	True on success
	 * @since 1.5
	 */
	function bind(& $array)
	{
		// Bind the array
		if (!$this->setProperties($array)) {
			$this->setError("Nie można zbindować tablicy 'POST' na obiekt.");
			return false;
		}

		// Make sure its an integer
		$this->gid = (int) $this->gid;

		return true;
	}
	
	/**
	 * Method ustawia nowy numer identyfikujący grupę obiektów
	 * lub zwraca biężący.
	 *
	 * @access 	public
	 * @param	string	$nameTab  Nazwa tabeli na której wyliczamy nowy $gid
	 * @return 	int 	Nowy lub biezący numer identyfikujący grupę
	 * @since 1.0
	 */
	function setGid($nameTab)
	{	
		static $gid;
		if (isset($gid)) {
			return $gid;
		}
		
		// Tylko raz zostanie wykonany ten kod dla pierwszej tablicy
		if (empty($this->gid)) {
			// Nadanie nowego numeru identyfikującego grupę		
			$query = 'SELECT max(gid) 
		          	   FROM '.$nameTab  
		          	   ;
		        $db =& JFactory::getDBO();         
		        $db->setQuery( $query );
		        $gid = (int) $db->loadResult() + 1;
		} else {
			// Bieżący numer grupy
			$gid = (int) $this->gid;
		}
		        
		return $gid;
	}

	/**
	 * Metoda zapisuje rekordy do poszczególnych tabel BD.
	 *
	 * @access 	public
	 * @return 	boolean	true on success
	 * @since 1.0
	 */
	function save( )
	{
		// Zapisanie rekordu do tablicy "jos_maszyny"
		if (!$this->saveTable('Maszyna')) {
			return false;
		}			
		// Zapisanie rekordu do tablicy "jos_dotacja_m"
		if (!$this->saveTable('Dotacja')) {
			return false;
		}
		// Zapisanie rekordu do tablicy "jos_wlasnosc_m"
		if (!$this->saveTable('Wlasciciel')) {
			return false;
		}
		// Zapisanie rekordu do tablicy "jos_wartosc_m"
		if (!$this->saveTable('Wartosc')) {
			return false;
		}
		// Zapisanie rekordu do tablicy "jos_obiekt_m"
		if (!$this->saveTable('Obiekt')) {
			return false;
		}
		// Zapisanie rekordu do tablicy "jos_akumulator_m"
		if (!$this->saveTable('Akumulator')) {
			return false;
		}
		// Zapisanie rekordu do tablicy "jos_prostownik_m"
		if (!$this->saveTable('Prostownik')) {
			return false;
		}
		// Zapisanie rekordu do tablicy "jos_ssawa_m"
		if (!$this->saveTable('Ssawa')) {
			return false;
		}
		// Zapisanie rekordu do tablicy "jos_ssawa_m"
		if (!$this->saveTable('Spolkauz')) {
			return false;
		}
		return true;
	}
	
	/**
  	 * Metoda zapisuje jeden nowy rekord do jednej tablicy BD.   					
	 *
	 * @access 	public
	 * @param	string	$name Nazwa klasy tabeli uzytkownika 
	 * @param	string	$prefix Prefiks klasy tabeli uzytkownika
	 * @return 	boolean True on success
	 * @since 1.5
	 */
	function saveTable( $name, $prefix = 'msTable' )
	{ 
		// Utworz obiekt tablicy
		$table =& $this->getTable($name, $prefix);
		// Pobiez z ob. usera wlasciwosci do ob. tablicy
		$table->bind($this->getProperties());	
		
		// Ustawienie identyfikatora grupy. 
		// Jeśli nowy obiekt to zostanie stworzony nowy nr $gid.	
		$table->gid = $this->setGid($table->_tbl);  
	
		/*
		 * Porownanie wlasciwosci dwoch maszyn
		 */
		$isEqualObjects = 0;   //Domyslnie obiekty sa nierowne
		// Nowy obiekt
		if ($this->gid) {
			// Porownanie wlasciwosci dwoch obiektow
			$isEqualObjects = $table->compareObjects();
			if ($isEqualObjects === -1) {
				// Blad odczytu tabeli
				return false;
			}
		}
		
		// Zapisujemy pola rejestracji tylko gdy user jest nowy 
		// lub sie zmienily jego dane.
		if ($isEqualObjects === 0) {
			// Kto rejestrowal/wyrejestrowal usera
			$me =& JFactory::getUser();
			$table->whoRegister = $me->get('name');
			unset($table->registerDate);  // Aby MySql nadał nową, aktualną date
		}
	
		// Sprawdz poprawnosc danych to store
		if (!$table->check()) {
			$this->setError($table->getError());
			return false;
		}

		// Zapisz dane z obiektu tablicy do tablicy bazy dabych
		if (!$table->store($isEqualObjects)) {
			$this->setError($table->getError());
			return false;
		}
		
		return true;
	}
	
	
	
	/**
	 * Metoda usuwa rekord obiektu z BD
	 *
	 * @access 	public
	 * @return 	boolean		True on success
	 * @since 1.0
	 */
	function delete( )
	{
		// Pobieramy tablicę na której dokonamy wirtualnego usunięcia (del=1)
		$table 	=& $this->getTable('Maszyna');
		// Zbinduj wlasciwosci tego obiektu do obiektu tablicy
		$table->bind($this->getProperties());
		
		// Kto wyrejestrowal 
		$me =& JFactory::getUser();
		$table->whoRegister = $me->get('name');
		unset($table->registerDate);  // Aby MySql nadał nową, aktualną date
		
		// Wirtualne usuniecie
		$table->del = 1;
		if ( !$table->store() ) {
			$this->setError($table->getError());
			return false;
		}
		
		return true;
	}


	/**
	 * Metoda laduje rekordy z wielu tabel SQL
	 *
	 * @access 	public
	 * @since 1.5
	 */
	function load()
	{	
		// Zaladuj tebele "jos_maszyny"
		$this->loadTable('Maszyna');			
		// Zaladuj tebele "jos_dotacja"
		$this->loadTable('Dotacja');
		// Zaladuj tebele "jos_wlas"
		$this->loadTable('Wlasciciel');
		// Zaladuj tebele "jos_wart"
		$this->loadTable('Wartosc');
		// Zaladuj tebele "jos_obiekt"
		$this->loadTable('Obiekt');
		// Zaladuj tebele "jos_aku"
		$this->loadTable('Akumulator');
		// Zaladuj tebele "jos_prosto"
		$this->loadTable('Prostownik');
		// Zaladuj tebele "jos_ssawa"
		$this->loadTable('Ssawa');
		// Zaladuj tebele "jos_maszyny_uzytkownik"
		$this->loadTable('Spolkauz');
		
	}
	
	/**
	 * Metoda laduje jeden rekord z jednej tabeli SQL
	 *
	 * @access 	public
	 * @param	string	$name  Nazwa klasy tablicy
	 * @param	string	$prefix Prefix klasy tablicy
	 * @return 	boolean True on success
	 * @since 1.5
	 */
	function loadTable($name, $prefix = 'msTable')
	{	
		// Numer identyfikujący grupę
		$gid = $this->gid;
		
		// Tworzy obiekt tablicy na bazie klasy msTable...
		$table =& $this->getTable($name, $prefix);
		// Zaladuj obiekt, danymi z tabeli BD
		if (!$table->load($gid)) {
			JError::raiseWarning( 'SOME_ERROR_CODE', get_class( $this ).'::load(): Nie można załadować maszyny klasy '.$prefix.$name.' rekordem o nr grupy: '. $gid);
			return false;
		}
		// Zbinduj obiekt danymi z obiektu tabeli msTable...
		$this->setProperties($table->getProperties());
				
		return true;
	}
}
